import { CustomForm, childrenProps, transitionProps } from "@/components/ProForm/interface";

/**
 * @param {String} form 需要设置的表单
 * @param {String} names 需要获取数据字典的名称 (多个以逗号隔开)
 * @param {Array}  transitionArr 需要装换的字段
 * @param {Function} db 回调方法
 * @description 将数据字典中内容设置到表单的 children 中
 */
export async function setDictionaries<T>(form: CustomForm<T>, code: string, transitionArr: transitionProps[] = []) {
  // 数据字典内容
  const data = await dictionaryListByCodes({ code });
  // 需要设置到表单中的内容集合
  let obj: any = {};

  // 数据字段获取的个数
  const namesLength = code.split(",").length;
  const transitionLength = transitionArr.length;

  // 当数据字典中  表单有两个或以上使用的是同一个 数据字典字段时  会 transitionLength > namesLength
  const length = namesLength > transitionLength ? namesLength : transitionLength;
  // 是否已设置完成
  let count = 0;

  // 将返回数据转换成key-value形式
  for (let item of data) {
    obj[item.key] = item.value;
  }

  if (transitionArr.length) {
    // 字段替换
    for (const item of transitionArr) {
      const { newField, oldField } = item || {};
      obj[newField] = data.find(v => v.key === oldField)?.value;
    }
  }

  // 将数据字段中内容设置到表单中
  for (let i = 0; i < form.options.length; i++) {
    const { prop } = form.options[i];
    if (obj[prop]) {
      count++;
      form.options[i].children = changeArrField(obj[prop], "dvalue");
      // 回填所有的数据字典后 跳出循环
      if (count >= length) {
        break;
      }
    }
  }
}
/**
 * @param {string} cacheField 缓存的字段
 * @param {Object} form 需要回填的表单
 * @param {Object} params 回填的参数
 * @description 回填表单内容 Cache field
 */
export const backfillFormParams = <T>(data: CustomForm<T>, newParams: any, cacheField = "", db?: () => void) => {
  // 将对应数据设置到表单中
  setTimeout(() => {
    if (cacheField) {
      // 将缓存进行回填
      let params = uni.getStorageSync(cacheField);
      setTimeout(() => {
        Object.keys(params).forEach(key => {
          data.form[key] = params[key] ? params[key] : data.form[key] || "";
        });
        db && db();
      }, 0);
    }

    if (newParams) Object.assign(data.form, newParams);

    db && db();
  }, 0);
};

/**
 * @param {Object} form 需要改变的表单
 * @param {Array} fields 需要设置的字段
 * @param {Boolean} flag 启用 false / 禁用 true
 * @param {String} type 修改的类型 disabled 启用/禁用   hide 隐藏 / 显示
 * @description 设置表单项是否禁用
 */
export const changeFormItemStatus = <T>(
  form: CustomForm<T>,
  fields: Array<string>,
  flag = false,
  type: "disabled" | "hide" = "disabled"
) => {
  let count = 0;
  for (const item of form.options) {
    const { prop, type: itemType } = item || {};

    if (!item.attrs) {
      continue;
    }
    if (!fields?.length || fields.includes(prop)) {
      if (type === "disabled") {
        if (itemType === "data_picker") {
          item.attrs.readonly = flag;
        } else {
          item.attrs.disabled = flag;
        }

        count++;
      } else if (type === "hide") {
        item.hide = flag;
        count++;
      }
    }

    // 设置完成直接跳出循环
    if (fields?.length && count >= fields.length) {
      break;
    }
  }
};

/**
 * @param {Object} form 需要改变的表单
 * @param {Array} children 选择项
 * @description 设置表单中的选择项
 */

interface sonProps {
  prop: string;
  children: childrenProps[];
}
export const setFormChildren = <T>(form: CustomForm<T>, children: sonProps[]) => {
  let count = 0;
  outerLoop: for (let item of form.options) {
    for (let son of children) {
      if (item.prop === son.prop) {
        item.children = son.children;
        count++;
        if (count === children.length) break outerLoop;
        break;
      }
    }
  }
};
